#include"stdio.h"
#include"malloc.h"

typedef struct stuInfo{
	char stuName[10];
	int Age;
}ElemType;

typedef struct node{
	ElemType data;
	struct node *next;
}ListNode,*ListPtr;


ListPtr CrateList(int n)         //建立一个由n个结点构成的单链表函数，返回结点指针类型
{
	  int i;
	  ListPtr p,q,head;
	  if(n<=0)
	  {
		return(NULL);
	  }
	  head=(ListPtr)malloc(sizeof(ListNode));    //生成第一个结点
	  printf("请输入姓名:");        //姓名
	  scanf("%s",head->data.stuName);
      printf("请输入年龄:");        //年龄
	  scanf("%d",&head->data.Age);
	  
	  p=head;                                     //p作为连接下一个结点q的指针
	  for(i=1;i<n;i++)
	  {
		q=(ListPtr)malloc(sizeof(ListNode));
		printf("请输入姓名:");        //姓名
		scanf("%s",q->data.stuName);
		printf("请输入年龄:");        //年龄
		scanf("%d",&q->data.Age);
		p->next=q;                              //连接q结点
		p=q;                                   //p跳到q上，在准备连接下一个结点q
	  }
	  p->next=NULL;                         //置尾结点指针域为空指针
	  return(head);                          //将已经建立起来的单链表头指针返回
}


ListPtr InsertList(ListPtr head,int i)                               //插入结点
{
	ListPtr s,p,q;
	int j=0;                      //查找第i个结点计数用
	if(i<0)
	{
		printf("插入位置不合法！");
		return NULL;        //参数i的值不合理
	}
	s=(ListPtr)malloc(sizeof(ListNode));
	
	printf("input new node datas:\n");
	printf("请输入姓名:");        //姓名
	scanf("%s",s->data.stuName);
	printf("请输入年龄:");        //年龄
	scanf("%d",&s->data.Age);
	
	if(i==0)                            //i==0表明是在第一个结点之前插入新结点
	{
		s->next=head;                   //把头地址赋给s的指针域
		head=s;                         //把s结点赋给head
		return(head);
	}
	q=head;                           //查找新结点的位置，在p和q之间
	while(j<i&&q!=NULL)
	{
		j++;
		p=q;                     //把q结点赋给p
		q=q->next;               //把q的下一个结点赋给q
   }
   if(j<i)                      //如果j<i则说明q遇到NULL
   {
   	return NULL;
   }
   p->next=s;                  //把插入的结点地址赋给p,(连接结点)
   s->next=q;                 //把q最终的地址赋给s的指针域
   return(head);
}


void printList(ListPtr head)                      //链表的输出
{
	ListPtr p=head;                          //从头指针出发，依次输出，直到遇到NULL结束
	while(p!=NULL)
	{
		printf("姓名:%s\t年龄:%d\n",p->data.stuName,p->data.Age);
		p=p->next;                               //p指针顺序后移一个结点
	}
}



int main(int argc,char argv[]){
	ListPtr ListHead;
	int number;
	int index;
	char command;
	while(1)
	{
		printf("1 Create List\n");
		printf("2 Printf List\n");
		printf("3 Insert List\n");
		printf("4 Quit\n");
		printf("请选择：");
		char temp = getchar();
		if( temp == '\n'){
			command = getchar();
		}else{
			command = temp;
		}
		switch(command)
		{
			case '1':
					printf("请输入要创建的节点个数:");
					scanf("%d",&number);
					ListHead = CrateList(number);
					break;
			case '2':
					printf("链表为:\n");
					printList(ListHead);
					break;
			case '3':
					printf("请输入要插入的链表节点位置:");
					scanf("%d",&index);
					ListHead = InsertList(ListHead,index);
					break;
			case '4':
					return 0;
			default:
					printf("输入不合法，请重新输入：");
		}
	}
	return 0;
}
